package main

import (
	"fmt"
	sentinel "github.com/alibaba/sentinel-golang/api"
	"github.com/alibaba/sentinel-golang/core/flow"
	"github.com/alibaba/sentinel-golang/util"
	"log"
	"math/rand"
	"time"
)

func main() {
	// 务必先进行初始化
	err := sentinel.InitDefault()
	if err != nil {
		log.Fatal(err)
	}

	// 配置一条限流规则
	_, err = flow.LoadRules([]*flow.Rule{
		{
			Resource:  "some-test",
			Threshold: 10, // 表示流控阈值；如果字段 StatIntervalInMs 是1000(也就是1秒)，那么Threshold就表示QPS，流量控制器也就会依据资源的QPS来做流控。
			// 请求的间隔控制在 1000/10=100 ms
			TokenCalculateStrategy: flow.Direct,
			ControlBehavior:        flow.Reject, // 流控效果为匀速排队
			StatIntervalInMs:       1000,        // 规则对应的流量控制器的独立统计结构的统计周期。如果StatIntervalInMs是1000，也就是统计QPS。
		},
	})
	if err != nil {
		fmt.Println(err)
		return
	}

	for i := 0; i < 12; i++ {
		// 埋点逻辑，埋点资源名为 some-test
		e, b := sentinel.Entry("some-test")
		if b != nil {
			fmt.Println(util.CurrentTimeMillis(), "block")
			// 请求被拒绝，在此处进行处理
			time.Sleep(time.Duration(rand.Uint64()%10) * time.Millisecond)
		} else {
			// 请求允许通过，此处编写业务逻辑
			fmt.Println(util.CurrentTimeMillis(), "Passed")
			time.Sleep(time.Duration(rand.Uint64()%10) * time.Millisecond)
			// 务必保证业务结束后调用 Exit
			e.Exit()
		}

	}
}
